<?php
namespace app\api\controller;
use alipay\Wechatpay;
use think\controller\Rest;
use think\Db;
/**
 * 示例接口
 */
class Order extends Rest
{
//如果$noNeedLogin为空表示所有接口都需要登录才能请求
//如果$noNeedRight为空表示所有接口都需要验证权限才能请求
//如果接口已经设置无需登录,那也就无需鉴权了
//
// 无需登录的接口,*表示全部
    protected $noNeedLogin = '*';
// 无需鉴权的接口,*表示全部
    protected $noNeedRight = '*';
    /**
     * 生成订单号
     *
     */
    public function get_order_no()
    {
        $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
        $orderSn = $yCode[intval(date('Y')) - 2018] . strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
        return $orderSn;
    }
    /**
     * 生成订单
     *
     * @paramstring $mobile 手机号
     * @paramstring $event 事件名称userId:用户id  goodsId:商品id  trade_type:支付类型，wxpay,alipay amount:金额 body:商品描述 attach:附件参数
     */
    public function order_create()
    {
        if (!$this->request->request('userId') || !$this->request->request('goodsId') || !$this->request->request('trade_type') || !$this->request->request('amount')) {
            $ret = array(
                'code' => 200,
                'msg' => "参数错误",
            );
            echo json_encode($ret);
            exit();
        }
        $orderInfo = array(
            'orderSn' => $this->get_order_no(),
            'userId' => $this->request->request('userId'),
            'goodsId' => $this->request->request('goodsId'),
            'payType' => $this->request->request('trade_type'),
            'amount' => $this->request->request('amount'),
            'create_time' => date('Y-m-d H:i:s'),
            'result' => '',
            'status' => 0,
        );
//生成订单入库
//$result = Db::name('order')->insert($orderInfo);
        $result = 1;
        if ($result) {
//1.统一下单方法
            $appid = 'wx7eaf1f7be3bd17d7';
            $mch_id = '1509635571';
            $notify_url = '回调地址';
            $key = 'dc483e80a7a0bd9ef71d8cf973673924';
            $wechatAppPay =  new Wechatpay($appid, $mch_id, $notify_url, $key);
            $params['body'] = $this->request->request('des') ? $this->request->request('des') : ''; //商品描述
            $params['attach'] = $this->request->request('attach') ? $this->request->request('attach') : '测试'; //商品描述
            $params['out_trade_no'] = $orderInfo['orderSn']; //自定义的订单号
            $params['total_fee'] = $orderInfo['amount']; //订单金额 只能为整数 单位为分
            $params['trade_type'] = 'APP'; //交易类型 JSAPI | NATIVE | APP | WAP
            $result = $wechatAppPay->unifiedOrder($params);
        // print_r($result); // result中就是返回的各种信息信息，成功的情况下也包含很重要的prepay_id
        //2.创建APP端预支付参数
            /** @varTYPE_NAME $result */
            $data = @$wechatAppPay->getAppPayParams($result['prepay_id']);
        // 根据上行取得的支付参数请求支付即可
        // print_r($data);
            exit(json_encode($data));
        // } else {
        //     $ret = array(
        //         'code' => 500,
        //     );
        // }
        // echo json_encode($ret);
        }
    }
    /**
     *微信回调地址接口
     *
     *
     *
     */
    public function notify()
    {
//接收微信xml格式信息
        $xmlData = file_get_contents('php://input');
//  //转换为数组
//测试用例
//$array = json_decode($xmlData,TRUE);
        $array = $this->XMLDataParse($xmlData);
//   var_dump($this -> verifySign($array));
//对微信返回的签名进行验证是否正确
        if (!$this->verifySign($array)) {
            exit('<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名不正确]]></return_msg></xml>');
        }
//写支付记录，更新订单表
//to do...
        $orderSn = $array['out_trade_no']; //商户订单号
        $order = array(
            'paySn' => $array['transaction_id'], //微信支付订单号
            'status' => 1,
            'pay_time' => date('Y-m-d H:i:s'),
        );
//查看订单状态，为已支付则完成流程
        $orderInfo = Db::table('GameOrderSn')->where('orderSn', $orderSn)->find();
        if ($orderInfo['status'] == 1) {
            exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
        }
// 启动事务
        Db::startTrans();
        try {
            $userId = $orderInfo['userId'];
            $goodsId=$orderInfo['goodsId'];
            $amount=$orderInfo['amount'];
            Db::table('GameOrderSn')->where('orderSn', $orderSn)->update($order); //更新订单信息
//查询商品，为已支付则完成流程
            $goodsInfo = Db::table('ShopInfoList')->where('ItemID', $goodsId)->find();
//计算购买道具数据量
            $nums=($amount/$goodsInfo['Price'])*$goodsInfo['GoodsNum'];
//更新用户道具
            Db::table('GameScoreInfo')->where('UserID', $userId)->setInc('InsureScore',$nums);
            Db::commit();
//处理购买后的业务逻辑.通知充值结果到服务器
            $codeM = 13;
            $codeS = 1;
            $this->send_msg($userId,$codeM,$codeS);
        } catch (\Exception $e) {
// 回滚事务
            Db::rollback();
        }
//下面是处理完逻辑,返回给微信服务器的
        exit('<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>');
    }
    /**
     * 通知充值结果到服务器
     * @param $params
     * @returnstring
     */
    public function send_msg($userId,$codeM,$codeS)
    {
    }
}